using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UIElements;
//背包系统的显示界面抽象类

public abstract class InventoryDisplay : MonoBehaviour
{
    [SerializeField] MouseItemData mouseInventoryItem;  // 鼠标物品数据

    protected InventorySystem inventorySystem;  // 背包系统
    protected Dictionary<InventorySlot_UI, InventorySlot> slotDictionary;  // UI槽位与背包槽位的映射

    public InventorySystem InventorySystem => inventorySystem;  // 背包系统属性
    public Dictionary<InventorySlot_UI, InventorySlot> SlotDictionary => slotDictionary;  // UI槽位与背包槽位映射字典属性

    public abstract void AssignSlot(InventorySystem invToDisplay, int offset);  // 分配背包槽位的抽象方法

    protected virtual void Start() { }

    protected virtual void UpdateSlot(InventorySlot updatedSlot)
    {
        foreach (var slot in SlotDictionary)
        {
            if (slot.Value == updatedSlot)  // 如果背包槽位与更新的槽位匹配
            {
                slot.Key.UpdateUISlot(updatedSlot);  // 更新对应的UI槽位
            }

        }
    }

    // 处理点击槽位事件的方法
    public void SlotClicked(InventorySlot_UI clickedUISlot)
    {
        //如果点击的物品槽有物品，鼠标槽没有物品
        if (clickedUISlot.AssignedInventorySlot.ItemData != null && mouseInventoryItem.AssignedInventorySlot.ItemData == null)
        {
            //按shift拆分物品
            if (Input.GetKey(KeyCode.LeftShift) && clickedUISlot.AssignedInventorySlot.SplitStack(out InventorySlot halfStackSlot))
            {
                mouseInventoryItem.UpdateMouseSlot(halfStackSlot);
                clickedUISlot.UpdateUISlot();// 更新点击的物品槽的显示
                return;
            }
            else
            {
                // 将鼠标槽位数据更新为点击的槽位的物品数据
                mouseInventoryItem.UpdateMouseSlot(clickedUISlot.AssignedInventorySlot);
                clickedUISlot.ClearSlot();// 清除点击的UI槽位的物品数据
                return;
            }

        }

        // 如果点击的物品槽没有物品，鼠标槽有物品，则将鼠标槽中的物品放入空的物品槽中
        if (clickedUISlot.AssignedInventorySlot.ItemData == null && mouseInventoryItem.AssignedInventorySlot.ItemData != null)
        {
            // 将鼠标槽中的物品赋值给点击的物品槽所关联的物品槽
            clickedUISlot.AssignedInventorySlot.AssignItem(mouseInventoryItem.AssignedInventorySlot);

            // 更新点击的物品槽的显示
            clickedUISlot.UpdateUISlot();

            // 清空鼠标槽
            mouseInventoryItem.ClearSlot();
            return;
        }

        // 如果点击的槽位和鼠标上的槽位都有物品
        // if (clickedUISlot.AssignedInventorySlot.ItemData != null && mouseInventoryItem.AssignedInventorySlot.ItemData != null)
        // {
        //     // 如果点击的槽位和鼠标上的槽位的物品不相同，则交换它们
        //     if (clickedUISlot.AssignedInventorySlot.ItemData != mouseInventoryItem.AssignedInventorySlot.ItemData)
        //     {
        //         SwapSlots(clickedUISlot);
        //     }
        // }

        // 点击的槽位和鼠标上的槽位都有物品
        if (clickedUISlot.AssignedInventorySlot.ItemData != null && mouseInventoryItem.AssignedInventorySlot.ItemData != null)
        {
            bool isSameItem = clickedUISlot.AssignedInventorySlot.ItemData == mouseInventoryItem.AssignedInventorySlot.ItemData;

            // 如果物品相同并且点击的槽位有足够的空间容纳鼠标上的物品堆叠
            if (isSameItem && clickedUISlot.AssignedInventorySlot.EnoughRoomLeftInStack(mouseInventoryItem.AssignedInventorySlot.StackSize))
            {
                // 将鼠标上的物品移动到点击的槽位
                clickedUISlot.AssignedInventorySlot.AssignItem(mouseInventoryItem.AssignedInventorySlot);
                clickedUISlot.UpdateUISlot();
                mouseInventoryItem.ClearSlot();
                return;
            }
            // 如果物品相同但是点击的槽位无法完全容纳鼠标上的物品堆叠
            else if (isSameItem && !clickedUISlot.AssignedInventorySlot.EnoughRoomLeftInStack(mouseInventoryItem.AssignedInventorySlot.StackSize, out int leftInStack))
            {
                // 如果点击的槽位有剩余空间
                if (leftInStack < 1)
                {
                    // 交换点击的槽位和鼠标上的槽位
                    SwapSlots(clickedUISlot);
                    return;
                }
                else
                {
                    int remainingOnMouse = mouseInventoryItem.AssignedInventorySlot.StackSize - leftInStack;

                    // 将部分物品移动到点击的槽位
                    clickedUISlot.AssignedInventorySlot.AddToStack(leftInStack);
                    clickedUISlot.UpdateUISlot();

                    // 创建新的槽位存放剩余的物品
                    InventorySlot newItem = new InventorySlot(mouseInventoryItem.AssignedInventorySlot.ItemData, remainingOnMouse);
                    mouseInventoryItem.ClearSlot();
                    mouseInventoryItem.UpdateMouseSlot(newItem);
                    return;
                }
            }
            // 物品不相同，交换点击的槽位和鼠标上的槽位
            else if (!isSameItem)
            {
                SwapSlots(clickedUISlot);
                return;
            }
        }
    }

    private void SwapSlots(InventorySlot_UI clickedUISlot)
    {
        // 保存鼠标上物品的信息到临时槽位
        var clonedSlot = new InventorySlot(mouseInventoryItem.AssignedInventorySlot.ItemData,
                                           mouseInventoryItem.AssignedInventorySlot.StackSize);

        // 清空鼠标上的槽位
        mouseInventoryItem.ClearSlot();

        // 将鼠标上的物品移动到点击的槽位
        mouseInventoryItem.UpdateMouseSlot(clickedUISlot.AssignedInventorySlot);

        // 清空点击的槽位
        clickedUISlot.ClearSlot();

        // 将临时槽位的物品移动到点击的槽位
        clickedUISlot.AssignedInventorySlot.AssignItem(clonedSlot);
        clickedUISlot.UpdateUISlot();
    }
}
